//
//  ViewController.m
//  study
//
//  Created by codew on 5/31/21.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 切换模式
//    [[NSRunLoop currentRunLoop] runMode:UITrackingRunLoopMode beforeDate:[NSDate date]];
    
    [self runloopTest4AddObserver];
}

/**
 1. 查看主 Runloop
 */
- (void)runloopTest1
{
    NSLog(@"%s", __func__);

    
    NSLog(@"============================================================================================");
    
    //    CFRunLoopGetCurrent();
    //    CFRunLoopGetMain();
    NSLog(@"mainRunLoop: %@", [NSRunLoop mainRunLoop]);
    
    NSLog(@"============================================================================================");
    
//    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
}


/**
 2.
 */

- (void)runloopTest2
{
    NSLog(@"%s", __func__);
    
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
    [thread start];
    
}

/**
 
 3.Runloop和Timer
 
 FOUNDATION_EXPORT NSRunLoopMode const NSDefaultRunLoopMode;
 FOUNDATION_EXPORT NSRunLoopMode const NSRunLoopCommonModes;
 UIKIT_EXTERN NSRunLoopMode const UITrackingRunLoopMode;
 
 */
- (void)runloopTest3
{
    
    
    // 1. 默认添加到NSDefaultRunLoopMode
//    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
    
    
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
    
    // 使用NSRunLoop ================================================================================================================
    
    // 定时器只运行在NSDefaultRunLoopMode下，一旦RunLoop进入其他模式，这个定时器就不会工作
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
        
    
    // UITrackingRunLoopMode
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
    
    
    
    // 定时器会跑在标记为common modes的模式下
    // 标记为common modes的模式：UITrackingRunLoopMode和kCFRunLoopDefaultMode
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    
    
    

    // 使用CFRunLoop ================================================================================================================
    CFRunLoopAddTimer(CFRunLoopGetCurrent(), (CFRunLoopTimerRef)timer, kCFRunLoopCommonModes);
    
}


/**
 4.Runloop和Observer
 */

- (void)runloopTest4AddObserver
{
    CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        
        NSLog(@"-----%zd", activity);
    });
    
    CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopCommonModes);
    
    CFRelease(observer);
}

/**
 5.Runloop和Timer
 自动添加到NSDefaultRunLoopMode
 scheduledTimerWithTimeInterval
 */
- (void)runloopTest5
{
    // 调用了scheduledTimer返回的定时器，已经自动被添加到当前runLoop中，而且是NSDefaultRunLoopMode
    NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1.2 target:self selector:@selector(run) userInfo:nil repeats:YES];
    
    CFRunLoopAddTimer(CFRunLoopGetCurrent(), (CFRunLoopTimerRef)timer, kCFRunLoopCommonModes);
}

/**
 6.Runloop在UIImageView的里的使用
 */
- (void)runloopTest6
{
    UIImageView * imageView;
    [imageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"placeholder"] afterDelay:3.0 inModes:@[NSDefaultRunLoopMode]];
}


- (IBAction)btnClick:(id)sender {
    
    NSLog(@"%s", __func__);
}




- (void)run
{
    NSLog(@"%s", __func__);
    
    
}




@end
